.NET 10.0 Preview 2 ist mit heiĂźer Nadel gestrickt
Die zweite Preview fĂĽr .NET 10.0 ist nur drei Wochen nach der ersten mit ĂĽberschaubaren Neuerungen erschienen. Einiges funktioniert noch nicht wie angekĂĽndigt.

(Bild: Pincasso/Shutterstock.com)
- Dr. Holger Schwichtenberg
.NET 10.0 Preview 2 steht zum Download auf der .NET-Website bereit. Eine Visual-Studio-Version, die dieses Release mitbringt, ist noch nicht erschienen. Zum Kompilieren einer .NET-10.0-Preview 2-Anwendung verwendet man die am 11. März 2025 erschienene Version Preview 2 von Visual Studio 2022 Version 17.14.
(Bild: Screenshot (Holger Schwichtenberg))
Lesen Sie auch
.NET-10.0-Vorschau erweitert Klassenbibliotheken
Vereinheitlichte Kommandozeilenparameterreihenfolge
In dem .NET-SDK-Kommandozeilenwerkzeug dotnet
hat Microsoft die Parameterreihenfolge vereinheitlicht. Es gab bisher viele Befehle, die aus einem Substantiv gefolgt von einem Verb oder Adjektiv bestanden (z. B. dotnet new list
, dotnet workload install
und dotnet nuget add
). Es gab aber auch einige Befehle, bei denen erst ein Verb stand, etwa dotnet add reference
und dotnet remove package
. Dies hat Microsoft nun vereinheitlicht zu folgenden neuen Befehlen:
dotnet package add
dotnet package list
dotnet package remove
dotnet reference add
dotnet reference list
dotnet reference remove
Die alten Befehle sind aber weiterhin vorhanden, sodass hier kein Breaking Change entsteht.
RightJoin() in Entity Framework Core
In .NET 10.0 Preview 1 hatte Microsoft zwei neue LINQ-Operatoren eingefĂĽhrt: LeftJoin()
und RightJoin()
. In Entity Framework Core 10 Preview 1 konnte der objektrelationale Mapper aber nur LeftJoin()
in SQL ĂĽbersetzen. In Preview 2 geht das auch mit RightJoin()
. Dabei ist zu betonen, dass auch bisher schon Right Joins mit Entity Framework Core möglich waren. Der neue Operator verkürzt nur die Syntax.
Verbesserung beim Zertifikatsexport nicht auffindbar
Nach den vielen Neuerungen in der Basisklassenbibliothek in .NET 10.0 Preview 1 soll es laut den Release Notes zu Preview 2 dieses Mal nur eine einzige Neuerung geben: In der Klasse X509Certificate2
soll eine neue Methode ExportPkcs12()
existieren, die Entwicklerinnen und Entwicklern mehr Kontrolle ĂĽber die VerschlĂĽsselungs- und Digest-Algorithmen geben soll. Die bisherige Methode Export()
verwendet noch veraltete Algorithmen wie 3DES und SHA-1. Die neue Methode ExportPkcs12()
soll auch AES und SHA-2-256 bieten.
In den Release Notes fehlt allerdings ein Beispiel und im Test konnte der Compiler weder auf der Klasse X509Certificate2
noch der Basisklasse X509Certificate
die Methode ExportPkcs12()
finden. Das zugehörige Issue auf GitHub steht auf dem Status "Closed". Da sich im Changelog zu .NET 10.0 Preview 2 auch kein Eintrag zu ExportPkcs12()
finden lässt, sind die Release Notes an dieser Stelle vermutlich voreilig und die neue Methode kommt erst in einer späteren Vorschauversion.
Partielle Konstruktoren und partielle Events kompilieren auch noch nicht
Seit C# 2.0 gibt es partielle Klassen und seit C# 3.0 partielle Methoden. Letztes Jahr kamen in C# 13.0 partielle Properties und Indexer hinzu. Nun in C# 14.0 sollen Entwicklerinnen und Entwickler das SchlĂĽsselwort partial
auch auf Konstruktoren und Events in C#-Klassen anwenden können (siehe Listing 1). So steht es in den Releases Notes zu C# in .NET 10.0 Preview 2. Der Compiler möchte das Beispiel aus der Dokumentation aber noch nicht übersetzen und meldet Fehler sowohl in Visual Studio als auch beim Kommandozeilenbefehl dotnet build
(siehe Abbildung 2 und 3), selbst wenn man <LangVersion>preview</LangVersion>
in die Projektdatei schreibt. Laut GitHub-Repository kommt das Feature in Visual Studio auch erst mit Version 17.14 Preview 3.
partial class C
{
partial C(int x, string y);
partial event Action<int, string> MyEvent;
}
partial class C
{
partial C(int x, string y) { }
partial event Action<int, string> MyEvent
{
add { }
remove { }
}
}
Listing 1: Partielle Konstruktoren und partielle Events. (Quelle: Microsoft)
(Bild: Screenshot (Holger Schwichtenberg))
(Bild: Screenshot (Holger Schwichtenberg))
Anpassung der Verbindungswiederherstellungsmeldungen in Blazor Server
In der Projektvorlage "Blazor Web App" findet man seit Preview 2 eine neue Razor Component im Ordner _Layout mit dem Namen ReconnectModal.razor. Diese Komponente ist die Darstellung des modalen Fensters, das Blazor Server anzeigt, wenn ein Abbruch der WebSockets-Verbindung zwischen Webbrowser und Webserver erfolgt ist und eine Wiederaufnahme versucht wird. Diese Darstellung war bisher nicht anpassbar. Nun können Entwicklerinnen und Entwickler hier in drei Fällen Einfluss auf die Texte und die Darstellung nehmen:
- Wiederherstellung wird versucht
- Wiederherstellung ist fehlgeschlagen und wird erneut versucht
- Wiederherstellung ist endgĂĽltig fehlgeschlagen
<script type="module" src="@Assets["Components/Layout/ReconnectModal.razor.js"]"></script>
<dialog id="components-reconnect-modal" data-nosnippet>
<div class="components-reconnect-container">
<div class="components-rejoining-animation" aria-hidden="true">
<div></div>
<div></div>
</div>
<p class="components-reconnect-first-attempt-visible">
Rejoining the server...
</p>
<p class="components-reconnect-repeated-attempt-visible">
Rejoin failed... trying again in <span id="components-seconds-to-next-attempt"></span> seconds.
</p>
<p class="components-reconnect-failed-visible">
Failed to rejoin.<br />Please retry or reload the page.
</p>
<button id="components-reconnect-button" class="components-reconnect-failed-visible">
Retry
</button>
</div>
</dialog>
Listing 2: Standardinhalt von ReconnectModal.razor
Zu ReconnectModal.razor gehören auch eine CSS-Datei ReconnectModal.razor.css und eine JavaScript-Datei ReconnectModal.razor.js. Auch diese Dateien sind anpassbar. ReconnectModal.razor wird am Ende von MainLayout.razor eingebunden via <ReconnectModal />
und kann auch komplett ersetzt werden.
NavigateTo() behält Scrollposition
Die Methode NavigateTo()
in der Klasse NavigationManager
führt User nicht mehr zum Beginn der Seite zurück, wenn nur URL-Parameter an die Seite angehängt werden:
nav.NavigateTo(nav.GetUriWithQueryParameter("count", currentCount));
Ein RĂĽcksprung an den Seitenanfang findet weiterhin bei Angabe von true
fĂĽr forceLoad
statt:
nav.NavigateTo(nav.GetUriWithQueryParameter("count", currentCount), forceLoad: true);
oder Ă„nderungen eines Teils des relativen Pfades:
nav.NavigateTo("/counter/" + currentCount);
Automatisches SchlieĂźen des Filters im QuickGrid
Im Steuerelement <QuickGrid>
gibt es nun eine neue Methode CloseColumnOptionsAsync()
, die Entwicklerinnen und Entwickler aufrufen können, damit sich die Eingabe von Filterkriterien schließt, wenn der Filter aktiviert wird (siehe Listing 3 und Abbildung 4).
<QuickGrid @ref="flightGrid" RowClass="ApplyRowClass" ItemsProvider="@itemsProvider" TGridItem="BO.WWWings.Flight" Virtualize="true" OverscanCount="@overscanCount">
<PropertyColumn Property="@(p => p.FlightNo)" Title="FlugNr" Sortable="true" />
<PropertyColumn Property="@(p => p.Departure)" Title="Abflugort" Sortable="true">
<ColumnOptions>
<input type="search" @bind="departureFilter" placeholder="Filter by Departure"
@bind:after="@(() => flightGrid.CloseColumnOptionsAsync())" />
</ColumnOptions>
</PropertyColumn>
<PropertyColumn Property="@(p => p.Destination)" Title="Zielort" Sortable="true" />
<PropertyColumn Property="@(p => p.FlightDate)" Title="Datum" Format="dd.MM.yyyy" Sortable="true" />
</QuickGrid>
Listing 3: Einsatz von CloseColumnOptionsAsync() im Steuerelement <QuickGrid>
(Bild: Screenshot (Holger Schwichtenberg))
OpenAPI-Dokumente mit XML-Kommentaren
Die von dem NuGet-Paket Microsoft.AspNetCore.OpenApi generierten OpenAPI-Metadaten für eine ASP.NET Core WebAPI können nun auch Informationen aus den XML-Kommentaren enthalten, die zu Klassen beziehungsweise Methoden hinterlegt sind. Diese Integration können Entwicklerinnen und Entwickler mit einem Eintrag in der Projektdatei aktivieren:
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
Welche XML-Kommentare wie in das OpenAPI-Dokument ĂĽbernommen werden, steht nicht in den Release Notes und leider lieĂź sich dies auch nicht testen, da durch die Installation des .NET 10.0 Preview 2 SDK alle WebAPI-Projekte beim Start nur noch HTTP-Fehler-404 liefern. Dieses Problem betrifft auch Projekte, die mit den aktuellsten Projektvorlagen neu angelegt wurden, und trat auf beiden verwendeten Testrechnern auf.
ShadowTypeConverter in .NET MAUI
In .NET MAUI 10.0 Preview 2 können Entwicklerinnen und Entwickler nun mit einer vereinfachten Syntax Schatten definieren:
<VerticalStackLayout BackgroundColor="#fff" Shadow="4 4 16 #000000 0.5" />
Dabei stehen die Zahlen in der Eigenschaft Shadow
für Offset X, Offset Y, Radius, Farbe und Opazität. Zuvor musste man hier eigene Tags verwenden:
<VerticalStackLayout BackgroundColor="#fff" >
<Shadow Brush="#000000"
Offset="4,4"
Radius="16"
Opacity="0.5" />
</VerticalStackLayout>
Geschwindigkeit der Sprachausgabe in .NET MAUI
Bei der Sprachausgabe mit der Schnittstelle TextToSpeech
kann man nun eine Geschwindigkeit via Rate
angeben:
IEnumerable<Locale> locales = await TextToSpeech.Default.GetLocalesAsync();
SpeechOptions options = new SpeechOptions()
{
Rate = 2.0f, // 0.1 - 2.0
Pitch = 1.5f, // 0.0 - 2.0
Volume = 0.75f, // 0.0 - 1.0
Locale = locales.FirstOrDefault()
};
await TextToSpeech.Default.SpeakAsync("Hallo aus .NET 10.0!", options);
Steuerung von Farben bei .NET MAUI
Entwicklerinnen und Entwickler können beim Steuerelement <Switch>
nun neben der OnColor
auch die OffColor
festlegen:
<Switch OffColor="Red"
OnColor="Green" />
Bei <SearchBar>
lässt sich die Farbe des Symbols steuern:
<SearchBar Placeholder="Search items..." SearchIconColor="Blue" />
Breaking Changes
Bei den Breaking Changes ist in Preview 2 bisher nur ein Eintrag hinzugekommen: Das .NET SDK verwendet bei den Workloads nun als Standard den in .NET 9.0 eingefĂĽhrten Modus "workload sets" anstelle des bisherigen Standards, den Microsoft "Loose Manifests" nennt.
Fazit
Mit drei angekĂĽndigten neuen Features, die nicht kompilieren (partielle Konstruktoren, partielle Events und Methode ExportPkcs12()
) sowie einem ganzen Projekttyp (WebAPIs), der zur Laufzeit nicht mehr funktioniert, scheint Preview 2 mit zu heißer Nadel gestrickt. Das lässt aber zu diesem Zeitpunkt natürlich noch keine Rückschlüsse auf das fertige Produkt zu, das im November 2025 erscheinen soll. Solche Unzulänglichkeiten gab es auch in früheren Preview-Versionen immer wieder. Bis zum Release-Termin sollen noch fünf weitere Preview-Versionen von April bis August 2025 sowie jeweils eine Release-Candidate-Version im September und Oktober erscheinen.
(mai)